home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
SGI Hot Mix 17
/
Hot Mix 17.iso
/
HM17_SGI
/
research
/
lib
/
trace.pro
< prev
next >
Wrap
Text File
|
1997-07-08
|
2KB
|
72 lines
; $Id: trace.pro,v 1.5 1997/01/15 03:11:50 ali Exp $
;
; Copyright (c) 1996-1997, Research Systems, Inc. All rights reserved.
; Unauthorized reproduction prohibited.
;+
; NAME:
; TRACE
;
; PURPOSE:
; This function computes the trace of an N by N array.
;
; CATEGORY:
; Linear Algebra.
;
; CALLING SEQUENCE:
; Result = TRACE(A)
;
; INPUTS:
; A: An N by N real or complex array.
;
; KEYWORD PARAMETERS:
; DOUBLE: If set to a non-zero value, computations are done in
; double precision arithmetic.
;
; EXAMPLE:
; Define an array, A.
; A = [[ 2.0, 1.0, 1.0, 1.5], $
; [ 4.0, -6.0, 0.0, 0.0], $
; [-2.0, 7.0, 2.0, 2.5], $
; [ 1.0, 0.5, 0.0, 5.0]]
;
; Compute the trace of A.
; Result = TRACE(A)
;
; The result should be: 3.00000
;
; REFERENCE:
; ADVANCED ENGINEERING MATHEMATICS (seventh edition)
; Erwin Kreyszig
; ISBN 0-471-55380-8
;
; MODIFICATION HISTORY:
; Written by: GGS, RSI, January 1996
;-
FUNCTION Trace, X, Double = Double
ON_ERROR, 2
Sx = SIZE(X)
if Sx[0] ne 2 then $
MESSAGE, "Input array must be 2-dimensional."
if Sx[1] ne Sx[2] then $
MESSAGE, "Input array must be square."
if N_ELEMENTS(Double) eq 0 then $
Double = (Sx[Sx[0]+1] eq 5) or $
(Sx[Sx[0]+1] eq 9)
;TOTAL(DoubleData, Double = 0) returns a double-precision result. Cast the
;result to COMPLEX or FLOAT if Double = 0.
if Double eq 0 and Sx[Sx[0]+1] eq 9 then RETURN, $
COMPLEX(TOTAL(X[LINDGEN(Sx[1]) * (Sx[1]+1)], Double = Double)) else $
if Double eq 0 and Sx[Sx[0]+1] eq 5 then RETURN, $
FLOAT(TOTAL(X[LINDGEN(Sx[1]) * (Sx[1]+1)], Double = Double)) $
else RETURN, $
TOTAL(X[LINDGEN(Sx[1]) * (Sx[1]+1)], Double = Double)
end